package org.example.v3;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.example.v3.action.PendingStateAction;
import org.example.v3.action.StateAction;

import java.util.logging.Logger;

/**
 * OrderStateMachine 类管理订单的当前状态，并处理状态转换。
 */
@Getter
@Setter
@ToString
public class OrderStateMachine {
    private static final Logger LOGGER = Logger.getLogger(OrderStateMachine.class.getName());
    private StateAction<OrderStateMachine, String> stateAction;

    /**
     * 构造函数，初始化订单状态为待处理状态。
     */
    public OrderStateMachine() {
        this.stateAction = new PendingStateAction();
    }

    /**
     * 处理订单状态转换的事件。
     * @param event 触发事件
     */
    public void onEvent(String event) {
        LOGGER.info("当前状态: " + stateAction.getClass().getSimpleName() + ", 事件: " + event);
        stateAction.handle(this, event);
        LOGGER.info("新状态: " + stateAction.getClass().getSimpleName());
    }

    public static void main(String[] args) {
        OrderStateMachine order = new OrderStateMachine();
        System.out.println(order); // 输出: 订单当前状态: PendingStateAction

        order.onEvent("pay");
        System.out.println(order); // 输出: 订单已支付。
                                   //       订单当前状态: PaidStateAction

        order.onEvent("ship");
        System.out.println(order); // 输出: 订单已发货。
                                   //       订单当前状态: ShippedStateAction

        order.onEvent("deliver");
        System.out.println(order); // 输出: 订单已交付。
                                   //       订单当前状态: DeliveredStateAction

        // 尝试在订单已交付后再进行状态变更
        order.onEvent("pay");
        System.out.println(order); // 输出: 订单已交付。无法执行进一步操作。
                                   //       订单当前状态: DeliveredStateAction
    }
}
